package com.zhupf.queue;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author zhupf
 * @date 2025年01月09日 9:55
 * @Description 995. K 连续位的最小翻转次数
 * 给定一个二进制数组 nums 和一个整数 k 。
 * k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 ，同时把子数组中的每一个 0 都改成 1 ，把子数组中的每一个 1 都改成 0 。
 * 返回数组中不存在 0 所需的最小 k位翻转 次数。如果不可能，则返回 -1 。
 * 子数组 是数组的 连续 部分。
 * 示例 1：
 * <p>
 * 输入：nums = [0,1,0], K = 1
 * 输出：2
 * 解释：先翻转 A[0]，然后翻转 A[2]。
 * 示例 2：
 * <p>
 * 输入：nums = [1,1,0], K = 2
 * 输出：-1
 * 解释：无论我们怎样翻转大小为 2 的子数组，我们都不能使数组变为 [1,1,1]。
 * 示例 3：
 * <p>
 * 输入：nums = [0,0,0,1,0,1,1,0], K = 3
 * 输出：3
 * 解释：
 * 翻转 A[0],A[1],A[2]: A变成 [1,1,1,1,0,1,1,0]
 * 翻转 A[4],A[5],A[6]: A变成 [1,1,1,1,1,0,0,0]
 * 翻转 A[5],A[6],A[7]: A变成 [1,1,1,1,1,1,1,1]
 */
public class MinKBitFlips {

    public static void main(String[] args) {
//        System.out.println(1^1);
        int[] nums = {1, 1, 0};
        System.out.println(minKBitFlips(nums, 3));


    }

    public static int minKBitFlips(int[] nums, int k) {
        int ans = 0;
        Deque<Integer> deque = new LinkedList<>();
        for (int i = 0, j = k - 1; i<nums.length ; i++, j++) {
            if (j >= nums.length && (deque.size() % 2 == 1 ? nums[i] ^ 1 : nums[i]) == 0) {
                ans = -1;
                break;
            }else {
                if ((deque.size() % 2 == 1 ? nums[i] ^ 1 : nums[i]) == 0) {
                    ans++;
                    deque.offerLast(i);
                }
            }
            if (!deque.isEmpty() && (i - deque.peekFirst() + 1) >= k) {
                deque.pollFirst();
            }
        }
        return ans;
    }

}
